home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / PyShell.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  43KB  |  1,442 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import os
  5. import os.path as os
  6. import sys
  7. import string
  8. import getopt
  9. import re
  10. import socket
  11. import time
  12. import threading
  13. import traceback
  14. import types
  15. import exceptions
  16. import linecache
  17. from code import InteractiveInterpreter
  18.  
  19. try:
  20.     from Tkinter import *
  21. except ImportError:
  22.     print >>sys.__stderr__, "** IDLE can't import Tkinter.  Your Python may not be configured for Tk. **"
  23.     sys.exit(1)
  24.  
  25. import tkMessageBox
  26. from EditorWindow import EditorWindow, fixwordbreaks
  27. from FileList import FileList
  28. from ColorDelegator import ColorDelegator
  29. from UndoDelegator import UndoDelegator
  30. from OutputWindow import OutputWindow
  31. from configHandler import idleConf
  32. import idlever
  33. import rpc
  34. import Debugger
  35. import RemoteDebugger
  36. IDENTCHARS = string.ascii_letters + string.digits + '_'
  37. LOCALHOST = '127.0.0.1'
  38.  
  39. try:
  40.     from signal import SIGTERM
  41. except ImportError:
  42.     SIGTERM = 15
  43.  
  44. warning_stream = sys.__stderr__
  45.  
  46. try:
  47.     import warnings
  48. except ImportError:
  49.     pass
  50.  
  51.  
  52. def idle_showwarning(message, category, filename, lineno):
  53.     file = warning_stream
  54.     
  55.     try:
  56.         file.write(warnings.formatwarning(message, category, filename, lineno))
  57.     except IOError:
  58.         pass
  59.  
  60.  
  61. warnings.showwarning = idle_showwarning
  62.  
  63. def idle_formatwarning(message, category, filename, lineno):
  64.     '''Format warnings the IDLE way'''
  65.     s = '\nWarning (from warnings module):\n'
  66.     s += '  File "%s", line %s\n' % (filename, lineno)
  67.     line = linecache.getline(filename, lineno).strip()
  68.     if line:
  69.         s += '    %s\n' % line
  70.     
  71.     s += '%s: %s\n>>> ' % (category.__name__, message)
  72.     return s
  73.  
  74. warnings.formatwarning = idle_formatwarning
  75.  
  76. def extended_linecache_checkcache(filename = None, orig_checkcache = linecache.checkcache):
  77.     '''Extend linecache.checkcache to preserve the <pyshell#...> entries
  78.  
  79.     Rather than repeating the linecache code, patch it to save the
  80.     <pyshell#...> entries, call the original linecache.checkcache()
  81.     (which destroys them), and then restore the saved entries.
  82.  
  83.     orig_checkcache is bound at definition time to the original
  84.     method, allowing it to be patched.
  85.  
  86.     '''
  87.     cache = linecache.cache
  88.     save = { }
  89.     for filename in cache.keys():
  90.         if filename[:1] + filename[-1:] == '<>':
  91.             save[filename] = cache[filename]
  92.             continue
  93.     
  94.     orig_checkcache()
  95.     cache.update(save)
  96.  
  97. linecache.checkcache = extended_linecache_checkcache
  98.  
  99. class PyShellEditorWindow(EditorWindow):
  100.     '''Regular text edit window in IDLE, supports breakpoints'''
  101.     
  102.     def __init__(self, *args):
  103.         self.breakpoints = []
  104.         EditorWindow.__init__(self, *args)
  105.         self.text.bind('<<set-breakpoint-here>>', self.set_breakpoint_here)
  106.         self.text.bind('<<clear-breakpoint-here>>', self.clear_breakpoint_here)
  107.         self.text.bind('<<open-python-shell>>', self.flist.open_shell)
  108.         self.breakpointPath = os.path.join(idleConf.GetUserCfgDir(), 'breakpoints.lst')
  109.         if self.io.filename:
  110.             self.restore_file_breaks()
  111.         
  112.         
  113.         def filename_changed_hook(old_hook = self.io.filename_change_hook, self = self):
  114.             self.restore_file_breaks()
  115.             old_hook()
  116.  
  117.         self.io.set_filename_change_hook(filename_changed_hook)
  118.  
  119.     rmenu_specs = [
  120.         ('Set Breakpoint', '<<set-breakpoint-here>>'),
  121.         ('Clear Breakpoint', '<<clear-breakpoint-here>>')]
  122.     
  123.     def set_breakpoint(self, lineno):
  124.         text = self.text
  125.         filename = self.io.filename
  126.         text.tag_add('BREAK', '%d.0' % lineno, '%d.0' % (lineno + 1))
  127.         
  128.         try:
  129.             i = self.breakpoints.index(lineno)
  130.         except ValueError:
  131.             self.breakpoints.append(lineno)
  132.  
  133.         
  134.         try:
  135.             debug = self.flist.pyshell.interp.debugger
  136.             debug.set_breakpoint_here(filename, lineno)
  137.         except:
  138.             pass
  139.  
  140.  
  141.     
  142.     def set_breakpoint_here(self, event = None):
  143.         text = self.text
  144.         filename = self.io.filename
  145.         if not filename:
  146.             text.bell()
  147.             return None
  148.         
  149.         lineno = int(float(text.index('insert')))
  150.         self.set_breakpoint(lineno)
  151.  
  152.     
  153.     def clear_breakpoint_here(self, event = None):
  154.         text = self.text
  155.         filename = self.io.filename
  156.         if not filename:
  157.             text.bell()
  158.             return None
  159.         
  160.         lineno = int(float(text.index('insert')))
  161.         
  162.         try:
  163.             self.breakpoints.remove(lineno)
  164.         except:
  165.             pass
  166.  
  167.         text.tag_remove('BREAK', 'insert linestart', 'insert lineend +1char')
  168.         
  169.         try:
  170.             debug = self.flist.pyshell.interp.debugger
  171.             debug.clear_breakpoint_here(filename, lineno)
  172.         except:
  173.             pass
  174.  
  175.  
  176.     
  177.     def clear_file_breaks(self):
  178.         if self.breakpoints:
  179.             text = self.text
  180.             filename = self.io.filename
  181.             if not filename:
  182.                 text.bell()
  183.                 return None
  184.             
  185.             self.breakpoints = []
  186.             text.tag_remove('BREAK', '1.0', END)
  187.             
  188.             try:
  189.                 debug = self.flist.pyshell.interp.debugger
  190.                 debug.clear_file_breaks(filename)
  191.  
  192.         
  193.  
  194.     
  195.     def store_file_breaks(self):
  196.         '''Save breakpoints when file is saved'''
  197.         breaks = self.breakpoints
  198.         filename = self.io.filename
  199.         
  200.         try:
  201.             lines = open(self.breakpointPath, 'r').readlines()
  202.         except IOError:
  203.             lines = []
  204.  
  205.         new_file = open(self.breakpointPath, 'w')
  206.         for line in lines:
  207.             if not line.startswith(filename + '='):
  208.                 new_file.write(line)
  209.                 continue
  210.         
  211.         self.update_breakpoints()
  212.         breaks = self.breakpoints
  213.         if breaks:
  214.             new_file.write(filename + '=' + str(breaks) + '\n')
  215.         
  216.         new_file.close()
  217.  
  218.     
  219.     def restore_file_breaks(self):
  220.         self.text.update()
  221.         filename = self.io.filename
  222.         if filename is None:
  223.             return None
  224.         
  225.         if os.path.isfile(self.breakpointPath):
  226.             lines = open(self.breakpointPath, 'r').readlines()
  227.             for line in lines:
  228.                 if line.startswith(filename + '='):
  229.                     breakpoint_linenumbers = eval(line[len(filename) + 1:])
  230.                     for breakpoint_linenumber in breakpoint_linenumbers:
  231.                         self.set_breakpoint(breakpoint_linenumber)
  232.                     
  233.             
  234.         
  235.  
  236.     
  237.     def update_breakpoints(self):
  238.         '''Retrieves all the breakpoints in the current window'''
  239.         text = self.text
  240.         ranges = text.tag_ranges('BREAK')
  241.         linenumber_list = self.ranges_to_linenumbers(ranges)
  242.         self.breakpoints = linenumber_list
  243.  
  244.     
  245.     def ranges_to_linenumbers(self, ranges):
  246.         lines = []
  247.         for index in range(0, len(ranges), 2):
  248.             lineno = int(float(ranges[index]))
  249.             end = int(float(ranges[index + 1]))
  250.             while lineno < end:
  251.                 lines.append(lineno)
  252.                 lineno += 1
  253.         
  254.         return lines
  255.  
  256.     
  257.     def _close(self):
  258.         '''Extend base method - clear breaks when module is closed'''
  259.         self.clear_file_breaks()
  260.         EditorWindow._close(self)
  261.  
  262.  
  263.  
  264. class PyShellFileList(FileList):
  265.     '''Extend base class: IDLE supports a shell and breakpoints'''
  266.     EditorWindow = PyShellEditorWindow
  267.     pyshell = None
  268.     
  269.     def open_shell(self, event = None):
  270.         if self.pyshell:
  271.             self.pyshell.top.wakeup()
  272.         else:
  273.             self.pyshell = PyShell(self)
  274.             if self.pyshell:
  275.                 if not self.pyshell.begin():
  276.                     return None
  277.                 
  278.             
  279.         return self.pyshell
  280.  
  281.  
  282.  
  283. class ModifiedColorDelegator(ColorDelegator):
  284.     '''Extend base class: colorizer for the shell window itself'''
  285.     
  286.     def __init__(self):
  287.         ColorDelegator.__init__(self)
  288.         self.LoadTagDefs()
  289.  
  290.     
  291.     def recolorize_main(self):
  292.         self.tag_remove('TODO', '1.0', 'iomark')
  293.         self.tag_add('SYNC', '1.0', 'iomark')
  294.         ColorDelegator.recolorize_main(self)
  295.  
  296.     
  297.     def LoadTagDefs(self):
  298.         ColorDelegator.LoadTagDefs(self)
  299.         theme = idleConf.GetOption('main', 'Theme', 'name')
  300.         self.tagdefs.update({
  301.             'stdin': {
  302.                 'background': None,
  303.                 'foreground': None },
  304.             'stdout': idleConf.GetHighlight(theme, 'stdout'),
  305.             'stderr': idleConf.GetHighlight(theme, 'stderr'),
  306.             'console': idleConf.GetHighlight(theme, 'console'),
  307.             None: idleConf.GetHighlight(theme, 'normal') })
  308.  
  309.  
  310.  
  311. class ModifiedUndoDelegator(UndoDelegator):
  312.     '''Extend base class: forbid insert/delete before the I/O mark'''
  313.     
  314.     def insert(self, index, chars, tags = None):
  315.         
  316.         try:
  317.             if self.delegate.compare(index, '<', 'iomark'):
  318.                 self.delegate.bell()
  319.                 return None
  320.         except TclError:
  321.             pass
  322.  
  323.         UndoDelegator.insert(self, index, chars, tags)
  324.  
  325.     
  326.     def delete(self, index1, index2 = None):
  327.         
  328.         try:
  329.             if self.delegate.compare(index1, '<', 'iomark'):
  330.                 self.delegate.bell()
  331.                 return None
  332.         except TclError:
  333.             pass
  334.  
  335.         UndoDelegator.delete(self, index1, index2)
  336.  
  337.  
  338.  
  339. class MyRPCClient(rpc.RPCClient):
  340.     
  341.     def handle_EOF(self):
  342.         '''Override the base class - just re-raise EOFError'''
  343.         raise EOFError
  344.  
  345.  
  346.  
  347. class ModifiedInterpreter(InteractiveInterpreter):
  348.     
  349.     def __init__(self, tkconsole):
  350.         self.tkconsole = tkconsole
  351.         locals = sys.modules['__main__'].__dict__
  352.         InteractiveInterpreter.__init__(self, locals = locals)
  353.         self.save_warnings_filters = None
  354.         self.restarting = False
  355.         self.subprocess_arglist = self.build_subprocess_arglist()
  356.  
  357.     port = 8833
  358.     rpcclt = None
  359.     rpcpid = None
  360.     
  361.     def spawn_subprocess(self):
  362.         args = self.subprocess_arglist
  363.         self.rpcpid = os.spawnv(os.P_NOWAIT, sys.executable, args)
  364.  
  365.     
  366.     def build_subprocess_arglist(self):
  367.         w = [ '-W' + s for s in sys.warnoptions ]
  368.         del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc', default = False, type = 'bool')
  369.         if sys.platform[:3] == 'win' and ' ' in sys.executable:
  370.             decorated_exec = '"%s"' % sys.executable
  371.         else:
  372.             decorated_exec = sys.executable
  373.         return [
  374.             decorated_exec] + w + [
  375.             '-c',
  376.             command,
  377.             str(self.port)]
  378.  
  379.     
  380.     def start_subprocess(self):
  381.         self.spawn_subprocess()
  382.         addr = (LOCALHOST, self.port)
  383.         for i in range(3):
  384.             time.sleep(i)
  385.             
  386.             try:
  387.                 self.rpcclt = MyRPCClient(addr)
  388.             continue
  389.             except socket.error:
  390.                 err = None
  391.                 continue
  392.             
  393.  
  394.         else:
  395.             return None
  396.         self.rpcclt.listening_sock.settimeout(10)
  397.         
  398.         try:
  399.             self.rpcclt.accept()
  400.         except socket.timeout:
  401.             None<EXCEPTION MATCH>socket.error
  402.             err = None<EXCEPTION MATCH>socket.error
  403.             self.display_no_subprocess_error()
  404.             return None
  405.         except:
  406.             None<EXCEPTION MATCH>socket.error
  407.  
  408.         self.rpcclt.register('stdin', self.tkconsole)
  409.         self.rpcclt.register('stdout', self.tkconsole.stdout)
  410.         self.rpcclt.register('stderr', self.tkconsole.stderr)
  411.         self.rpcclt.register('flist', self.tkconsole.flist)
  412.         self.rpcclt.register('linecache', linecache)
  413.         self.rpcclt.register('interp', self)
  414.         self.transfer_path()
  415.         self.poll_subprocess()
  416.         return self.rpcclt
  417.  
  418.     
  419.     def restart_subprocess(self):
  420.         if self.restarting:
  421.             return self.rpcclt
  422.         
  423.         self.restarting = True
  424.         debug = self.getdebugger()
  425.         if debug:
  426.             
  427.             try:
  428.                 RemoteDebugger.close_subprocess_debugger(self.rpcclt)
  429.  
  430.         
  431.         self.rpcclt.close()
  432.         self.unix_terminate()
  433.         console = self.tkconsole
  434.         was_executing = console.executing
  435.         console.executing = False
  436.         self.spawn_subprocess()
  437.         
  438.         try:
  439.             self.rpcclt.accept()
  440.         except socket.timeout:
  441.             err = None
  442.             self.display_no_subprocess_error()
  443.             return None
  444.  
  445.         self.transfer_path()
  446.         console.text.delete('iomark', 'end-1c')
  447.         if was_executing:
  448.             console.write('\n')
  449.             console.showprompt()
  450.         
  451.         halfbar = ((int(console.width) - 16) // 2) * '='
  452.         console.write(halfbar + ' RESTART ' + halfbar)
  453.         console.text.mark_set('restart', 'end-1c')
  454.         console.text.mark_gravity('restart', 'left')
  455.         console.showprompt()
  456.         if debug:
  457.             gui = RemoteDebugger.restart_subprocess_debugger(self.rpcclt)
  458.             debug.load_breakpoints()
  459.         
  460.         self.restarting = False
  461.         return self.rpcclt
  462.  
  463.     
  464.     def __request_interrupt(self):
  465.         self.rpcclt.remotecall('exec', 'interrupt_the_server', (), { })
  466.  
  467.     
  468.     def interrupt_subprocess(self):
  469.         threading.Thread(target = self._ModifiedInterpreter__request_interrupt).start()
  470.  
  471.     
  472.     def kill_subprocess(self):
  473.         
  474.         try:
  475.             self.rpcclt.close()
  476.         except AttributeError:
  477.             pass
  478.  
  479.         self.unix_terminate()
  480.         self.tkconsole.executing = False
  481.         self.rpcclt = None
  482.  
  483.     
  484.     def unix_terminate(self):
  485.         '''UNIX: make sure subprocess is terminated and collect status'''
  486.         if hasattr(os, 'kill'):
  487.             
  488.             try:
  489.                 os.kill(self.rpcpid, SIGTERM)
  490.             except OSError:
  491.                 return None
  492.  
  493.             
  494.             try:
  495.                 os.waitpid(self.rpcpid, 0)
  496.             except OSError:
  497.                 return None
  498.             except:
  499.                 None<EXCEPTION MATCH>OSError
  500.             
  501.  
  502.         None<EXCEPTION MATCH>OSError
  503.  
  504.     
  505.     def transfer_path(self):
  506.         self.runcommand("if 1:\n        import sys as _sys\n        _sys.path = %r\n        del _sys\n        _msg = 'Use File/Exit or your end-of-file key to quit IDLE'\n        __builtins__.quit = __builtins__.exit = _msg\n        del _msg\n        \n" % (sys.path,))
  507.  
  508.     active_seq = None
  509.     
  510.     def poll_subprocess(self):
  511.         clt = self.rpcclt
  512.         if clt is None:
  513.             return None
  514.         
  515.         
  516.         try:
  517.             response = clt.pollresponse(self.active_seq, wait = 0.050000000000000003)
  518.         except (EOFError, IOError, KeyboardInterrupt):
  519.             if self.tkconsole.closing:
  520.                 return None
  521.             
  522.             response = None
  523.             self.restart_subprocess()
  524.  
  525.         if response:
  526.             self.tkconsole.resetoutput()
  527.             self.active_seq = None
  528.             (how, what) = response
  529.             console = self.tkconsole.console
  530.             if how == 'OK':
  531.                 if what is not None:
  532.                     print >>console, repr(what)
  533.                 
  534.             elif how == 'EXCEPTION':
  535.                 if self.tkconsole.getvar('<<toggle-jit-stack-viewer>>'):
  536.                     self.remote_stack_viewer()
  537.                 
  538.             elif how == 'ERROR':
  539.                 errmsg = 'PyShell.ModifiedInterpreter: Subprocess ERROR:\n'
  540.                 print >>sys.__stderr__, errmsg, what
  541.                 print >>console, errmsg, what
  542.             
  543.             self.tkconsole.endexecuting()
  544.         
  545.         if not self.tkconsole.closing:
  546.             self.tkconsole.text.after(self.tkconsole.pollinterval, self.poll_subprocess)
  547.         
  548.  
  549.     debugger = None
  550.     
  551.     def setdebugger(self, debugger):
  552.         self.debugger = debugger
  553.  
  554.     
  555.     def getdebugger(self):
  556.         return self.debugger
  557.  
  558.     
  559.     def open_remote_stack_viewer(self):
  560.         '''Initiate the remote stack viewer from a separate thread.
  561.  
  562.         This method is called from the subprocess, and by returning from this
  563.         method we allow the subprocess to unblock.  After a bit the shell
  564.         requests the subprocess to open the remote stack viewer which returns a
  565.         static object looking at the last exceptiopn.  It is queried through
  566.         the RPC mechanism.
  567.  
  568.         '''
  569.         self.tkconsole.text.after(300, self.remote_stack_viewer)
  570.  
  571.     
  572.     def remote_stack_viewer(self):
  573.         import RemoteObjectBrowser as RemoteObjectBrowser
  574.         oid = self.rpcclt.remotequeue('exec', 'stackviewer', ('flist',), { })
  575.         if oid is None:
  576.             self.tkconsole.root.bell()
  577.             return None
  578.         
  579.         item = RemoteObjectBrowser.StubObjectTreeItem(self.rpcclt, oid)
  580.         ScrolledCanvas = ScrolledCanvas
  581.         TreeNode = TreeNode
  582.         import TreeWidget
  583.         top = Toplevel(self.tkconsole.root)
  584.         theme = idleConf.GetOption('main', 'Theme', 'name')
  585.         background = idleConf.GetHighlight(theme, 'normal')['background']
  586.         sc = ScrolledCanvas(top, bg = background, highlightthickness = 0)
  587.         sc.frame.pack(expand = 1, fill = 'both')
  588.         node = TreeNode(sc.canvas, None, item)
  589.         node.expand()
  590.  
  591.     gid = 0
  592.     
  593.     def execsource(self, source):
  594.         '''Like runsource() but assumes complete exec source'''
  595.         filename = self.stuffsource(source)
  596.         self.execfile(filename, source)
  597.  
  598.     
  599.     def execfile(self, filename, source = None):
  600.         '''Execute an existing file'''
  601.         if source is None:
  602.             source = open(filename, 'r').read()
  603.         
  604.         
  605.         try:
  606.             code = compile(source, filename, 'exec')
  607.         except (OverflowError, SyntaxError):
  608.             self.tkconsole.resetoutput()
  609.             tkerr = self.tkconsole.stderr
  610.             print >>tkerr, '*** Error in script or command!\n'
  611.             print >>tkerr, 'Traceback (most recent call last):'
  612.             InteractiveInterpreter.showsyntaxerror(self, filename)
  613.             self.tkconsole.showprompt()
  614.  
  615.         self.runcode(code)
  616.  
  617.     
  618.     def runsource(self, source):
  619.         '''Extend base class method: Stuff the source in the line cache first'''
  620.         filename = self.stuffsource(source)
  621.         self.more = 0
  622.         self.save_warnings_filters = warnings.filters[:]
  623.         warnings.filterwarnings(action = 'error', category = SyntaxWarning)
  624.         if isinstance(source, types.UnicodeType):
  625.             import IOBinding as IOBinding
  626.             
  627.             try:
  628.                 source = source.encode(IOBinding.encoding)
  629.             except UnicodeError:
  630.                 self.tkconsole.resetoutput()
  631.                 self.write('Unsupported characters in input')
  632.                 return None
  633.             except:
  634.                 None<EXCEPTION MATCH>UnicodeError
  635.             
  636.  
  637.         None<EXCEPTION MATCH>UnicodeError
  638.         
  639.         try:
  640.             return InteractiveInterpreter.runsource(self, source, filename)
  641.         finally:
  642.             if self.save_warnings_filters is not None:
  643.                 warnings.filters[:] = self.save_warnings_filters
  644.                 self.save_warnings_filters = None
  645.             
  646.  
  647.  
  648.     
  649.     def stuffsource(self, source):
  650.         '''Stuff source in the filename cache'''
  651.         filename = '<pyshell#%d>' % self.gid
  652.         self.gid = self.gid + 1
  653.         lines = source.split('\n')
  654.         linecache.cache[filename] = (len(source) + 1, 0, lines, filename)
  655.         return filename
  656.  
  657.     
  658.     def prepend_syspath(self, filename):
  659.         """Prepend sys.path with file's directory if not already included"""
  660.         self.runcommand('if 1:\n            _filename = %r\n            import sys as _sys\n            from os.path import dirname as _dirname\n            _dir = _dirname(_filename)\n            if not _dir in _sys.path:\n                _sys.path.insert(0, _dir)\n            del _filename, _sys, _dirname, _dir\n            \n' % (filename,))
  661.  
  662.     
  663.     def showsyntaxerror(self, filename = None):
  664.         '''Extend base class method: Add Colorizing
  665.  
  666.         Color the offending position instead of printing it and pointing at it
  667.         with a caret.
  668.  
  669.         '''
  670.         text = self.tkconsole.text
  671.         stuff = self.unpackerror()
  672.         if stuff:
  673.             (msg, lineno, offset, line) = stuff
  674.             if lineno == 1:
  675.                 pos = 'iomark + %d chars' % (offset - 1)
  676.             else:
  677.                 pos = 'iomark linestart + %d lines + %d chars' % (lineno - 1, offset - 1)
  678.             text.tag_add('ERROR', pos)
  679.             text.see(pos)
  680.             char = text.get(pos)
  681.             if char and char in IDENTCHARS:
  682.                 text.tag_add('ERROR', pos + ' wordstart', pos)
  683.             
  684.             self.tkconsole.resetoutput()
  685.             self.write('SyntaxError: %s\n' % str(msg))
  686.         else:
  687.             self.tkconsole.resetoutput()
  688.             InteractiveInterpreter.showsyntaxerror(self, filename)
  689.         self.tkconsole.showprompt()
  690.  
  691.     
  692.     def unpackerror(self):
  693.         (type, value, tb) = sys.exc_info()
  694.         ok = type is SyntaxError
  695.         if ok:
  696.             
  697.             try:
  698.                 (dummy_filename, lineno, offset, line) = (msg,)
  699.                 if not offset:
  700.                     offset = 0
  701.             ok = 0
  702.  
  703.         
  704.         if ok:
  705.             return (msg, lineno, offset, line)
  706.         else:
  707.             return None
  708.  
  709.     
  710.     def showtraceback(self):
  711.         '''Extend base class method to reset output properly'''
  712.         self.tkconsole.resetoutput()
  713.         self.checklinecache()
  714.         InteractiveInterpreter.showtraceback(self)
  715.         if self.tkconsole.getvar('<<toggle-jit-stack-viewer>>'):
  716.             self.tkconsole.open_stack_viewer()
  717.         
  718.  
  719.     
  720.     def checklinecache(self):
  721.         c = linecache.cache
  722.         for key in c.keys():
  723.             if key[:1] + key[-1:] != '<>':
  724.                 del c[key]
  725.                 continue
  726.         
  727.  
  728.     
  729.     def runcommand(self, code):
  730.         '''Run the code without invoking the debugger'''
  731.         if self.tkconsole.executing:
  732.             self.display_executing_dialog()
  733.             return 0
  734.         
  735.         if self.rpcclt:
  736.             self.rpcclt.remotequeue('exec', 'runcode', (code,), { })
  737.         else:
  738.             exec code in self.locals
  739.         return 1
  740.  
  741.     
  742.     def runcode(self, code):
  743.         '''Override base class method'''
  744.         if self.tkconsole.executing:
  745.             self.interp.restart_subprocess()
  746.         
  747.         self.checklinecache()
  748.         if self.save_warnings_filters is not None:
  749.             warnings.filters[:] = self.save_warnings_filters
  750.             self.save_warnings_filters = None
  751.         
  752.         debugger = self.debugger
  753.         
  754.         try:
  755.             self.tkconsole.beginexecuting()
  756.             
  757.             try:
  758.                 if not debugger and self.rpcclt is not None:
  759.                     self.active_seq = self.rpcclt.asyncqueue('exec', 'runcode', (code,), { })
  760.                 elif debugger:
  761.                     debugger.run(code, self.locals)
  762.                 else:
  763.                     exec code in self.locals
  764.             except SystemExit:
  765.                 if tkMessageBox.askyesno('Exit?', 'Do you want to exit altogether?', default = 'yes', master = self.tkconsole.text):
  766.                     raise 
  767.                 else:
  768.                     self.showtraceback()
  769.             except:
  770.                 tkMessageBox.askyesno('Exit?', 'Do you want to exit altogether?', default = 'yes', master = self.tkconsole.text)
  771.                 self.showtraceback()
  772.  
  773.         finally:
  774.             if not use_subprocess:
  775.                 self.tkconsole.endexecuting()
  776.             
  777.  
  778.  
  779.     
  780.     def write(self, s):
  781.         '''Override base class method'''
  782.         self.tkconsole.stderr.write(s)
  783.  
  784.     
  785.     def display_port_binding_error(self):
  786.         tkMessageBox.showerror('Port Binding Error', "IDLE can't bind TCP/IP port 8833, which is necessary to communicate with its Python execution server.  Either no networking is installed on this computer or another process (another IDLE?) is using the port.  Run IDLE with the -n command line switch to start without a subprocess and refer to Help/IDLE Help 'Running without a subprocess' for further details.", master = self.tkconsole.text)
  787.  
  788.     
  789.     def display_no_subprocess_error(self):
  790.         tkMessageBox.showerror('Subprocess Startup Error', "IDLE's subprocess didn't make connection.  Either IDLE can't start a subprocess or personal firewall software is blocking the connection.", master = self.tkconsole.text)
  791.  
  792.     
  793.     def display_executing_dialog(self):
  794.         tkMessageBox.showerror('Already executing', 'The Python Shell window is already executing a command; please wait until it is finished.', master = self.tkconsole.text)
  795.  
  796.  
  797.  
  798. class PyShell(OutputWindow):
  799.     shell_title = 'Python Shell'
  800.     ColorDelegator = ModifiedColorDelegator
  801.     UndoDelegator = ModifiedUndoDelegator
  802.     menu_specs = [
  803.         ('file', '_File'),
  804.         ('edit', '_Edit'),
  805.         ('debug', '_Debug'),
  806.         ('options', '_Options'),
  807.         ('windows', '_Windows'),
  808.         ('help', '_Help')]
  809.     from IdleHistory import History
  810.     
  811.     def __init__(self, flist = None):
  812.         if use_subprocess:
  813.             ms = self.menu_specs
  814.             if ms[2][0] != 'shell':
  815.                 ms.insert(2, ('shell', '_Shell'))
  816.             
  817.         
  818.         self.interp = ModifiedInterpreter(self)
  819.         if flist is None:
  820.             root = Tk()
  821.             fixwordbreaks(root)
  822.             root.withdraw()
  823.             flist = PyShellFileList(root)
  824.         
  825.         OutputWindow.__init__(self, flist, None, None)
  826.         import __builtin__ as __builtin__
  827.         __builtin__.quit = __builtin__.exit = 'To exit, type Ctrl-D.'
  828.         self.config(usetabs = 1, indentwidth = 8, context_use_ps1 = 1)
  829.         text = self.text
  830.         text.configure(wrap = 'char')
  831.         text.bind('<<newline-and-indent>>', self.enter_callback)
  832.         text.bind('<<plain-newline-and-indent>>', self.linefeed_callback)
  833.         text.bind('<<interrupt-execution>>', self.cancel_callback)
  834.         text.bind('<<beginning-of-line>>', self.home_callback)
  835.         text.bind('<<end-of-file>>', self.eof_callback)
  836.         text.bind('<<open-stack-viewer>>', self.open_stack_viewer)
  837.         text.bind('<<toggle-debugger>>', self.toggle_debugger)
  838.         text.bind('<<toggle-jit-stack-viewer>>', self.toggle_jit_stack_viewer)
  839.         if use_subprocess:
  840.             text.bind('<<view-restart>>', self.view_restart_mark)
  841.             text.bind('<<restart-shell>>', self.restart_shell)
  842.         
  843.         self.save_stdout = sys.stdout
  844.         self.save_stderr = sys.stderr
  845.         self.save_stdin = sys.stdin
  846.         import IOBinding
  847.         self.stdout = PseudoFile(self, 'stdout', IOBinding.encoding)
  848.         self.stderr = PseudoFile(self, 'stderr', IOBinding.encoding)
  849.         self.console = PseudoFile(self, 'console', IOBinding.encoding)
  850.         if not use_subprocess:
  851.             sys.stdout = self.stdout
  852.             sys.stderr = self.stderr
  853.             sys.stdin = self
  854.         
  855.         self.history = self.History(self.text)
  856.         self.pollinterval = 50
  857.  
  858.     
  859.     def get_standard_extension_names(self):
  860.         return idleConf.GetExtensions(shell_only = True)
  861.  
  862.     reading = False
  863.     executing = False
  864.     canceled = False
  865.     endoffile = False
  866.     closing = False
  867.     
  868.     def set_warning_stream(self, stream):
  869.         global warning_stream
  870.         warning_stream = stream
  871.  
  872.     
  873.     def get_warning_stream(self):
  874.         return warning_stream
  875.  
  876.     
  877.     def toggle_debugger(self, event = None):
  878.         if self.executing:
  879.             tkMessageBox.showerror("Don't debug now", 'You can only toggle the debugger when idle', master = self.text)
  880.             self.set_debugger_indicator()
  881.             return 'break'
  882.         else:
  883.             db = self.interp.getdebugger()
  884.             if db:
  885.                 self.close_debugger()
  886.             else:
  887.                 self.open_debugger()
  888.  
  889.     
  890.     def set_debugger_indicator(self):
  891.         db = self.interp.getdebugger()
  892.         self.setvar('<<toggle-debugger>>', not (not db))
  893.  
  894.     
  895.     def toggle_jit_stack_viewer(self, event = None):
  896.         pass
  897.  
  898.     
  899.     def close_debugger(self):
  900.         db = self.interp.getdebugger()
  901.         if db:
  902.             self.interp.setdebugger(None)
  903.             db.close()
  904.             if self.interp.rpcclt:
  905.                 RemoteDebugger.close_remote_debugger(self.interp.rpcclt)
  906.             
  907.             self.resetoutput()
  908.             self.console.write('[DEBUG OFF]\n')
  909.             sys.ps1 = '>>> '
  910.             self.showprompt()
  911.         
  912.         self.set_debugger_indicator()
  913.  
  914.     
  915.     def open_debugger(self):
  916.         if self.interp.rpcclt:
  917.             dbg_gui = RemoteDebugger.start_remote_debugger(self.interp.rpcclt, self)
  918.         else:
  919.             dbg_gui = Debugger.Debugger(self)
  920.         self.interp.setdebugger(dbg_gui)
  921.         dbg_gui.load_breakpoints()
  922.         sys.ps1 = '[DEBUG ON]\n>>> '
  923.         self.showprompt()
  924.         self.set_debugger_indicator()
  925.  
  926.     
  927.     def beginexecuting(self):
  928.         '''Helper for ModifiedInterpreter'''
  929.         self.resetoutput()
  930.         self.executing = 1
  931.  
  932.     
  933.     def endexecuting(self):
  934.         '''Helper for ModifiedInterpreter'''
  935.         self.executing = 0
  936.         self.canceled = 0
  937.         self.showprompt()
  938.  
  939.     
  940.     def close(self):
  941.         '''Extend EditorWindow.close()'''
  942.         if self.executing:
  943.             response = tkMessageBox.askokcancel('Kill?', 'The program is still running!\n Do you want to kill it?', default = 'ok', parent = self.text)
  944.             if response == False:
  945.                 return 'cancel'
  946.             
  947.         
  948.         if self.reading:
  949.             self.top.quit()
  950.         
  951.         self.canceled = True
  952.         self.closing = True
  953.         self.text.after(2 * self.pollinterval, self.close2)
  954.  
  955.     
  956.     def close2(self):
  957.         return EditorWindow.close(self)
  958.  
  959.     
  960.     def _close(self):
  961.         '''Extend EditorWindow._close(), shut down debugger and execution server'''
  962.         self.close_debugger()
  963.         if use_subprocess:
  964.             self.interp.kill_subprocess()
  965.         
  966.         sys.stdout = self.save_stdout
  967.         sys.stderr = self.save_stderr
  968.         sys.stdin = self.save_stdin
  969.         self.interp = None
  970.         self.console = None
  971.         self.flist.pyshell = None
  972.         self.history = None
  973.         EditorWindow._close(self)
  974.  
  975.     
  976.     def ispythonsource(self, filename):
  977.         '''Override EditorWindow method: never remove the colorizer'''
  978.         return True
  979.  
  980.     
  981.     def short_title(self):
  982.         return self.shell_title
  983.  
  984.     COPYRIGHT = 'Type "copyright", "credits" or "license()" for more information.'
  985.     firewallmessage = "\n    ****************************************************************\n    Personal firewall software may warn about the connection IDLE\n    makes to its subprocess using this computer's internal loopback\n    interface.  This connection is not visible on any external\n    interface and no data is sent to or received from the Internet.\n    ****************************************************************\n    "
  986.     
  987.     def begin(self):
  988.         self.resetoutput()
  989.         if use_subprocess:
  990.             nosub = ''
  991.             client = self.interp.start_subprocess()
  992.             if not client:
  993.                 self.close()
  994.                 return False
  995.             
  996.         else:
  997.             nosub = '==== No Subprocess ===='
  998.         self.write('Python %s on %s\n%s\n%s\nIDLE %s      %s\n' % (sys.version, sys.platform, self.COPYRIGHT, self.firewallmessage, idlever.IDLE_VERSION, nosub))
  999.         self.showprompt()
  1000.         import Tkinter as Tkinter
  1001.         Tkinter._default_root = None
  1002.         return True
  1003.  
  1004.     
  1005.     def readline(self):
  1006.         save = self.reading
  1007.         
  1008.         try:
  1009.             self.reading = 1
  1010.             self.top.mainloop()
  1011.         finally:
  1012.             self.reading = save
  1013.  
  1014.         line = self.text.get('iomark', 'end-1c')
  1015.         if len(line) == 0:
  1016.             line = '\n'
  1017.         
  1018.         if isinstance(line, unicode):
  1019.             import IOBinding
  1020.             
  1021.             try:
  1022.                 line = line.encode(IOBinding.encoding)
  1023.             except UnicodeError:
  1024.                 pass
  1025.             except:
  1026.                 None<EXCEPTION MATCH>UnicodeError
  1027.             
  1028.  
  1029.         None<EXCEPTION MATCH>UnicodeError
  1030.         self.resetoutput()
  1031.         if self.canceled:
  1032.             self.canceled = 0
  1033.             if not use_subprocess:
  1034.                 raise KeyboardInterrupt
  1035.             
  1036.         
  1037.         if self.endoffile:
  1038.             self.endoffile = 0
  1039.             line = ''
  1040.         
  1041.         return line
  1042.  
  1043.     
  1044.     def isatty(self):
  1045.         return True
  1046.  
  1047.     
  1048.     def cancel_callback(self, event = None):
  1049.         
  1050.         try:
  1051.             if self.text.compare('sel.first', '!=', 'sel.last'):
  1052.                 return None
  1053.         except:
  1054.             pass
  1055.  
  1056.         if not self.executing or self.reading:
  1057.             self.resetoutput()
  1058.             self.interp.write('KeyboardInterrupt\n')
  1059.             self.showprompt()
  1060.             return 'break'
  1061.         
  1062.         self.endoffile = 0
  1063.         self.canceled = 1
  1064.         if self.executing and self.interp.rpcclt:
  1065.             if self.interp.getdebugger():
  1066.                 self.interp.restart_subprocess()
  1067.             else:
  1068.                 self.interp.interrupt_subprocess()
  1069.         
  1070.         if self.reading:
  1071.             self.top.quit()
  1072.         
  1073.         return 'break'
  1074.  
  1075.     
  1076.     def eof_callback(self, event):
  1077.         if self.executing and not (self.reading):
  1078.             return None
  1079.         
  1080.         if not self.text.compare('iomark', '==', 'insert') and self.text.compare('insert', '==', 'end-1c'):
  1081.             return None
  1082.         
  1083.         if not self.executing:
  1084.             self.resetoutput()
  1085.             self.close()
  1086.         else:
  1087.             self.canceled = 0
  1088.             self.endoffile = 1
  1089.             self.top.quit()
  1090.         return 'break'
  1091.  
  1092.     
  1093.     def home_callback(self, event):
  1094.         if event.state != 0 and event.keysym == 'Home':
  1095.             return None
  1096.         
  1097.         if self.text.compare('iomark', '<=', 'insert') and self.text.compare('insert linestart', '<=', 'iomark'):
  1098.             self.text.mark_set('insert', 'iomark')
  1099.             self.text.tag_remove('sel', '1.0', 'end')
  1100.             self.text.see('insert')
  1101.             return 'break'
  1102.         
  1103.  
  1104.     
  1105.     def linefeed_callback(self, event):
  1106.         if self.reading:
  1107.             self.text.insert('insert', '\n')
  1108.             self.text.see('insert')
  1109.         else:
  1110.             self.newline_and_indent_event(event)
  1111.         return 'break'
  1112.  
  1113.     
  1114.     def enter_callback(self, event):
  1115.         if self.executing and not (self.reading):
  1116.             return None
  1117.         
  1118.         
  1119.         try:
  1120.             sel = self.text.get('sel.first', 'sel.last')
  1121.             if sel:
  1122.                 if self.text.compare('sel.last', '<=', 'iomark'):
  1123.                     self.recall(sel)
  1124.                     return 'break'
  1125.                 
  1126.         except:
  1127.             pass
  1128.  
  1129.         if self.text.compare('insert', '<', 'iomark linestart'):
  1130.             prev = self.text.tag_prevrange('stdin', 'insert')
  1131.             if prev and self.text.compare('insert', '<', prev[1]):
  1132.                 self.recall(self.text.get(prev[0], prev[1]))
  1133.                 return 'break'
  1134.             
  1135.             next = self.text.tag_nextrange('stdin', 'insert')
  1136.             if next and self.text.compare('insert lineend', '>=', next[0]):
  1137.                 self.recall(self.text.get(next[0], next[1]))
  1138.                 return 'break'
  1139.             
  1140.             line = self.text.get('insert linestart', 'insert lineend')
  1141.             last_line_of_prompt = sys.ps1.split('\n')[-1]
  1142.             if line.startswith(last_line_of_prompt):
  1143.                 line = line[len(last_line_of_prompt):]
  1144.             
  1145.             self.recall(line)
  1146.             return 'break'
  1147.         
  1148.         if self.text.compare('insert', '<', 'iomark'):
  1149.             self.text.mark_set('insert', 'iomark')
  1150.         
  1151.         s = self.text.get('insert', 'end-1c')
  1152.         if s and not s.strip():
  1153.             self.text.delete('insert', 'end-1c')
  1154.         
  1155.         if self.text.compare('insert', '<', 'end-1c linestart'):
  1156.             self.newline_and_indent_event(event)
  1157.             return 'break'
  1158.         
  1159.         self.text.mark_set('insert', 'end-1c')
  1160.         if self.reading:
  1161.             self.text.insert('insert', '\n')
  1162.             self.text.see('insert')
  1163.         else:
  1164.             self.newline_and_indent_event(event)
  1165.         self.text.tag_add('stdin', 'iomark', 'end-1c')
  1166.         self.text.update_idletasks()
  1167.         if self.reading:
  1168.             self.top.quit()
  1169.         else:
  1170.             self.runit()
  1171.         return 'break'
  1172.  
  1173.     
  1174.     def recall(self, s):
  1175.         if self.history:
  1176.             self.history.recall(s)
  1177.         
  1178.  
  1179.     
  1180.     def runit(self):
  1181.         line = self.text.get('iomark', 'end-1c')
  1182.         i = len(line)
  1183.         while i > 0 and line[i - 1] in ' \t':
  1184.             i = i - 1
  1185.         if i > 0 and line[i - 1] == '\n':
  1186.             i = i - 1
  1187.         
  1188.         while i > 0 and line[i - 1] in ' \t':
  1189.             i = i - 1
  1190.         line = line[:i]
  1191.         more = self.interp.runsource(line)
  1192.  
  1193.     
  1194.     def open_stack_viewer(self, event = None):
  1195.         if self.interp.rpcclt:
  1196.             return self.interp.remote_stack_viewer()
  1197.         
  1198.         
  1199.         try:
  1200.             sys.last_traceback
  1201.         except:
  1202.             tkMessageBox.showerror('No stack trace', 'There is no stack trace yet.\n(sys.last_traceback is not defined)', master = self.text)
  1203.             return None
  1204.  
  1205.         StackBrowser = StackBrowser
  1206.         import StackViewer
  1207.         sv = StackBrowser(self.root, self.flist)
  1208.  
  1209.     
  1210.     def view_restart_mark(self, event = None):
  1211.         self.text.see('iomark')
  1212.         self.text.see('restart')
  1213.  
  1214.     
  1215.     def restart_shell(self, event = None):
  1216.         self.interp.restart_subprocess()
  1217.  
  1218.     
  1219.     def showprompt(self):
  1220.         self.resetoutput()
  1221.         
  1222.         try:
  1223.             s = str(sys.ps1)
  1224.         except:
  1225.             s = ''
  1226.  
  1227.         self.console.write(s)
  1228.         self.text.mark_set('insert', 'end-1c')
  1229.         self.set_line_and_column()
  1230.         self.io.reset_undo()
  1231.  
  1232.     
  1233.     def resetoutput(self):
  1234.         source = self.text.get('iomark', 'end-1c')
  1235.         if self.history:
  1236.             self.history.history_store(source)
  1237.         
  1238.         if self.text.get('end-2c') != '\n':
  1239.             self.text.insert('end-1c', '\n')
  1240.         
  1241.         self.text.mark_set('iomark', 'end-1c')
  1242.         self.set_line_and_column()
  1243.         sys.stdout.softspace = 0
  1244.  
  1245.     
  1246.     def write(self, s, tags = ()):
  1247.         
  1248.         try:
  1249.             self.text.mark_gravity('iomark', 'right')
  1250.             OutputWindow.write(self, s, tags, 'iomark')
  1251.             self.text.mark_gravity('iomark', 'left')
  1252.         except:
  1253.             pass
  1254.  
  1255.         if self.canceled:
  1256.             self.canceled = 0
  1257.             if not use_subprocess:
  1258.                 raise KeyboardInterrupt
  1259.             
  1260.         
  1261.  
  1262.  
  1263.  
  1264. class PseudoFile:
  1265.     
  1266.     def __init__(self, shell, tags, encoding = None):
  1267.         self.shell = shell
  1268.         self.tags = tags
  1269.         self.softspace = 0
  1270.         self.encoding = encoding
  1271.  
  1272.     
  1273.     def write(self, s):
  1274.         self.shell.write(s, self.tags)
  1275.  
  1276.     
  1277.     def writelines(self, l):
  1278.         map(self.write, l)
  1279.  
  1280.     
  1281.     def flush(self):
  1282.         pass
  1283.  
  1284.     
  1285.     def isatty(self):
  1286.         return True
  1287.  
  1288.  
  1289. usage_msg = '\nUSAGE: idle  [-deins] [-t title] [file]*\n       idle  [-dns] [-t title] (-c cmd | -r file) [arg]*\n       idle  [-dns] [-t title] - [arg]*\n\n  -h         print this help message and exit\n  -n         run IDLE without a subprocess (see Help/IDLE Help for details)\n\nThe following options will override the IDLE \'settings\' configuration:\n\n  -e         open an edit window\n  -i         open a shell window\n\nThe following options imply -i and will open a shell:\n\n  -c cmd     run the command in a shell, or\n  -r file    run script from file\n\n  -d         enable the debugger\n  -s         run $IDLESTARTUP or $PYTHONSTARTUP before anything else\n  -t title   set title of shell window\n\nA default edit window will be bypassed when -c, -r, or - are used.\n\n[arg]* are passed to the command (-c) or script (-r) in sys.argv[1:].\n\nExamples:\n\nidle\n        Open an edit window or shell depending on IDLE\'s configuration.\n\nidle foo.py foobar.py\n        Edit the files, also open a shell if configured to start with shell.\n\nidle -est "Baz" foo.py\n        Run $IDLESTARTUP or $PYTHONSTARTUP, edit foo.py, and open a shell\n        window with the title "Baz".\n\nidle -c "import sys; print sys.argv" "foo"\n        Open a shell window and run the command, passing "-c" in sys.argv[0]\n        and "foo" in sys.argv[1].\n\nidle -d -s -r foo.py "Hello World"\n        Open a shell window, run a startup script, enable the debugger, and\n        run foo.py, passing "foo.py" in sys.argv[0] and "Hello World" in\n        sys.argv[1].\n\necho "import sys; print sys.argv" | idle - "foobar"\n        Open a shell window, run the script piped in, passing \'\' in sys.argv[0]\n        and "foobar" in sys.argv[1].\n'
  1290.  
  1291. def main():
  1292.     global use_subprocess, root, flist
  1293.     use_subprocess = True
  1294.     enable_shell = False
  1295.     enable_edit = False
  1296.     debug = False
  1297.     cmd = None
  1298.     script = None
  1299.     startup = False
  1300.     
  1301.     try:
  1302.         sys.ps1
  1303.     except AttributeError:
  1304.         sys.ps1 = '>>> '
  1305.  
  1306.     
  1307.     try:
  1308.         (opts, args) = getopt.getopt(sys.argv[1:], 'c:deihnr:st:')
  1309.     except getopt.error:
  1310.         msg = None
  1311.         sys.stderr.write('Error: %s\n' % str(msg))
  1312.         sys.stderr.write(usage_msg)
  1313.         sys.exit(2)
  1314.  
  1315.     for o, a in opts:
  1316.         if o == '-c':
  1317.             cmd = a
  1318.             enable_shell = True
  1319.         
  1320.         if o == '-d':
  1321.             debug = True
  1322.             enable_shell = True
  1323.         
  1324.         if o == '-e':
  1325.             enable_edit = True
  1326.         
  1327.         if o == '-h':
  1328.             sys.stdout.write(usage_msg)
  1329.             sys.exit()
  1330.         
  1331.         if o == '-i':
  1332.             enable_shell = True
  1333.         
  1334.         if o == '-n':
  1335.             use_subprocess = False
  1336.         
  1337.         if o == '-r':
  1338.             script = a
  1339.             if os.path.isfile(script):
  1340.                 pass
  1341.             else:
  1342.                 print 'No script file: ', script
  1343.                 sys.exit()
  1344.             enable_shell = True
  1345.         
  1346.         if o == '-s':
  1347.             startup = True
  1348.             enable_shell = True
  1349.         
  1350.         if o == '-t':
  1351.             PyShell.shell_title = a
  1352.             enable_shell = True
  1353.             continue
  1354.     
  1355.     if args and args[0] == '-':
  1356.         cmd = sys.stdin.read()
  1357.         enable_shell = True
  1358.     
  1359.     for i in range(len(sys.path)):
  1360.         sys.path[i] = os.path.abspath(sys.path[i])
  1361.     
  1362.     if args and args[0] == '-':
  1363.         sys.argv = [
  1364.             ''] + args[1:]
  1365.     elif cmd:
  1366.         sys.argv = [
  1367.             '-c'] + args
  1368.     elif script:
  1369.         sys.argv = [
  1370.             script] + args
  1371.     elif args:
  1372.         enable_edit = True
  1373.         pathx = []
  1374.         for filename in args:
  1375.             pathx.append(os.path.dirname(filename))
  1376.         
  1377.         for dir in pathx:
  1378.             dir = os.path.abspath(dir)
  1379.             if dir not in sys.path:
  1380.                 sys.path.insert(0, dir)
  1381.                 continue
  1382.         
  1383.     else:
  1384.         dir = os.getcwd()
  1385.         if dir not in sys.path:
  1386.             sys.path.insert(0, dir)
  1387.         
  1388.     edit_start = idleConf.GetOption('main', 'General', 'editor-on-startup', type = 'bool')
  1389.     if not enable_edit:
  1390.         pass
  1391.     enable_edit = edit_start
  1392.     if not enable_shell:
  1393.         pass
  1394.     enable_shell = not edit_start
  1395.     root = Tk(className = 'Idle')
  1396.     fixwordbreaks(root)
  1397.     root.withdraw()
  1398.     flist = PyShellFileList(root)
  1399.     if enable_edit:
  1400.         if not cmd or script:
  1401.             for filename in args:
  1402.                 flist.open(filename)
  1403.             
  1404.             if not args:
  1405.                 flist.new()
  1406.             
  1407.         
  1408.     
  1409.     if enable_shell:
  1410.         if not flist.open_shell():
  1411.             return None
  1412.         
  1413.     
  1414.     shell = flist.pyshell
  1415.     if debug:
  1416.         shell.open_debugger()
  1417.     
  1418.     if startup:
  1419.         if not os.environ.get('IDLESTARTUP'):
  1420.             pass
  1421.         filename = os.environ.get('PYTHONSTARTUP')
  1422.         if filename and os.path.isfile(filename):
  1423.             shell.interp.execfile(filename)
  1424.         
  1425.     
  1426.     if shell or cmd or script:
  1427.         shell.interp.runcommand('if 1:\n            import sys as _sys\n            _sys.argv = %r\n            del _sys\n            \n' % (sys.argv,))
  1428.         if cmd:
  1429.             shell.interp.execsource(cmd)
  1430.         elif script:
  1431.             shell.interp.prepend_syspath(script)
  1432.             shell.interp.execfile(script)
  1433.         
  1434.     
  1435.     root.mainloop()
  1436.     root.destroy()
  1437.  
  1438. if __name__ == '__main__':
  1439.     sys.modules['PyShell'] = sys.modules['__main__']
  1440.     main()
  1441.  
  1442.